package week8;

import java.util.Scanner;

/**
 * Klasse voor het bijhouden van een menselijke Speler 
 * in het Boter-Kaas-Eieren spel.
 * Practicumopdracht P1.
 * @author  Theo Ruys
 * @version $Revision: 1.4 $
 */
public class MensSpeler extends Speler {

    // -- Constructors -----------------------------------------------

    /**
     * Construeert een nieuw Speler object.
     * @require <code>naam != null</code> <br>
     *          <code>mark == Bord.XX | Bord.OO</code>
     * @ensure  <code>this.getNaam() == naam</code><br>
     *          <code>this.getMark() == mark</code><br>
     */
    public MensSpeler(String naam, Mark mark) {
        super(naam, mark);
    }

    // -- Commands ---------------------------------------------------

    /**
     * Bepaalt het vakje voor de volgende zet van Speler s
     * door dit via de standard invoer/uitvoer te vragen.
     * @require <code>bord != null && s != null)</code>
     * @ensure  <code>bord.isVakje(result) && bord.isLeegVakje(result)</code>
     * @param   bord het spelersbord
     * @return  keuze van het vakje van deze Speler
     */
    public int bepaalZet(Bord bord) {
        String prompt = "> " + getNaam() + 
                        " (" + getMark().toString() + ")" +
                        ", wat is uw keuze? " ;
        int keuze = leesInt(prompt);
        boolean geldig = bord.isVakje(keuze) && bord.isLeegVakje(keuze);
        while (!geldig) {
            System.out.println("FOUT: vakje " +
                               keuze + " is geen geldige keuze");
            keuze = leesInt(prompt); 
            geldig = bord.isVakje(keuze) && bord.isLeegVakje(keuze);
        }
        return keuze;
    }
    
    /** 
     * Schrijft een prompt naar de standaard uitvoer en probeert
     * een int-waarde van de standaard invoer in te lezen. <br>
     * Blijft net zolang vragen en lezen totdat het eerste woord van de 
     * regel inderdaad een int-waarde is en levert deze int-waarde dan op.
     * @param  prompt de vraag die steeds wordt afgedrukt
     * @return de eerste int-waarde die als eerste op een regel ingetypt wordt
     */
    private int leesInt(String prompt) {
        int waarde = 0;
        boolean intGelezen = false;
        do {
            System.out.print(prompt);
            String regel   = (new Scanner(System.in)).nextLine();
            Scanner sregel = new Scanner(regel);
            if (sregel.hasNextInt()) {
                intGelezen = true;
                waarde = sregel.nextInt();
            }
        } while (! intGelezen) ;
       
        return waarde; 
    }

} // end of class MensSpeler


